Computers are ubiquitous in today's society. They come in all different varieties and can be found in places such as automobiles, the grocery store, banks, personal digital assistants, cell phones, as well as in many businesses. As will be appreciated by almost anyone owning a computer, there is a trend of incorporating more and more functionality into the same amount of space. This trend may be due to many factors, such as, the miniaturization and increasing density of system components with each successive generation of computer. These increases in functionality in successive generations of computers may cause inefficiencies in the way that computers operate.
One problem associated with the ever increasing functionality of computers is the disparity between the speed at which the computer's microprocessor operates versus the computer's memory access speed. Because of this disparity, computer's with high speed microprocessors may spend a large amount of time waiting for memory references to complete instead of performing computational operations. Some microprocessors attempt to overcome this disparity by implementing multi-threading. With proper hardware support, multi-threading can dramatically increase the performance of applications. However, as microprocessor performance continues to increase, the time spent synchronizing threads may become a large fraction of overall execution time. These synchronization efforts include locking data being accessed by one thread, so that other threads cannot manipulate data in use by another thread. As the number of threads increases, so does the overhead associated with implementing data locking, so it may be desirable to maximize the performance of each thread so that the number of threads requiring synchronization may be minimized.
To improve the performance of each thread, “speculative” execution may be implemented on one or more sections of the code prior to its occurrence in the program order—i.e., executed ahead of time. In brief, speculative execution may include executing sections of code ahead of time without immediately committing the changes to the microprocessor's architectural state. The changes made during the speculative execution later may be committed to the architectural state of the microprocessor if the speculative execution completes without encountering an interfering data access from another thread. If an access occurs that does not interfere with data in use by another thread, the speculative execution may succeed and results of the speculative execution may be committed to the architectural state of the processor. On the other hand, if an access occurs that does interfere with data in use by another thread, the speculative execution may fail, resulting in the speculative execution not being committed to the architectural state of the processor. Although terminating the speculative execution in this manner may prevent threads from interfering with each other, there may be situations where this termination is premature. For example, there may be subsequent load operations that will not interfere with data in use by another thread yet their execution still may be terminated. Hence, a method and apparatus for improving speculation success in execute ahead microprocessors is desired.